﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Linq;

namespace TMS
{
#region SINGLETON

    public class AdministradorXMLManager: XMLBaseManager
    {
        private static AdministradorXMLManager _instancia;

        public static AdministradorXMLManager getInstancia()
        {
            if (_instancia == null)
            {
                _instancia = new AdministradorXMLManager();
            }
            return _instancia;
        }

#endregion

        #region CONSTRUCTORES
        private AdministradorXMLManager()
        {
            nombreRoot = "Administradores";
            nombreArchivo = nombreRoot + ".xml";
        }

        #endregion

        #region METODOS

        public void addAdministrador(Administrador pAdministrador)
        {
            long idAdministrador;
            Usuario us = UsuarioXMLManager.getInstancia().getUsuarioById(pAdministrador.NroUsuario);
            if (us == null)
            {
                idAdministrador = UsuarioXMLManager.getInstancia().addUsuario((Usuario)pAdministrador);
            }
            else
            {
                idAdministrador = us.NroUsuario;
            }
            XDocument xDoc = loadDoc(); //Carga el documento.
            XElement administradores = xDoc.Root; //Obtiene la raiz del documento XML.
            XElement administrador = new XElement("Administrador"); //Genera un nuevo elemento.
            administrador.SetAttributeValue("IdUsuario", "" + idAdministrador);
            administradores.Add(administrador);
            saveDoc(xDoc);
        }
        public void updateAdministrador(Administrador pAdministrador)
        {
            UsuarioXMLManager.getInstancia().updateUsuario((Usuario)pAdministrador);
            XDocument xDoc = loadDoc(); //Carga el documento.
            XElement administradores = xDoc.Root; //Obtiene la raiz del documento XML.
            XElement xEl = null;
            try
            {
                xEl = administradores.Elements().Single(d => (long)d.Attribute("IdUsuario") == pAdministrador.NroUsuario);
            }
            catch (InvalidOperationException)
            {
                //Si el administrador no esta registrado...
                if (xEl == null)
                {
                    //Se crea uno nuevo registro.
                    XElement administrador = new XElement("Administrador"); //Genera un nuevo elemento.
                    administrador.SetAttributeValue("IdUsuario", "" + pAdministrador.NroUsuario);
                    administradores.Add(administrador);
                    saveDoc(xDoc);
                }
            }
        }
        public void removeByIdUsuario(long pId)
        {
            /*
             * Elimina el elemento del documento XML Administrador, pero no del documento Usuarios.
             */
            XDocument xDoc = loadDoc();
            XElement elemento = xDoc.Root.Elements().Single(a => (long)a.Attribute("IdUsuario") == pId);
            elemento.Remove();
            saveDoc(xDoc);
            /*Elimina al usuario al que se relaciona del documento Usuarios.xml*/
            /*UsuarioXMLManager.getInstancia().removeById(pId);*/
        }
        public bool existsById(long pId)
         {
             bool existe = false;
             XDocument xDoc = loadDoc();
             try
             {
                 XElement elementos = xDoc.Root.Elements().Single(a => (long)a.Attribute("IdUsuario") == pId);
                 if (elementos != null)
                 {
                     existe = true;
                 }
             }
             catch (InvalidOperationException)
             { 
             }
             return existe;
         }
        #endregion
    }
}